package com.mazewei.consumer.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置类，用于定义Fanout类型的交换机和队列
 */
@Configuration
public class FanoutConfig {

    /**
     * 创建并返回一个Fanout类型的交换机
     *
     * @return FanoutExchange实例，具有指定的名称
     */
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange("mazewei.fanout");
    }

    /**
     * 创建并返回一个队列
     *
     * @return Queue实例，具有指定的名称
     */
    @Bean
    public Queue fanoutQueue1() {
        return new Queue("fanout.queue1");
    }

    /**
     * 将队列绑定到Fanout交换机
     *
     * @param fanoutExchange Fanout类型的交换机
     * @param fanoutQueue1   要绑定的队列
     * @return Binding实例，表示队列和交换机的绑定关系
     */
    @Bean
    public Binding bindingQueue1ToExchange(FanoutExchange fanoutExchange, Queue fanoutQueue1) {
        return BindingBuilder.bind(fanoutQueue1()).to(fanoutExchange);
    }

    /**
     * 创建并返回另一个队列
     *
     * @return Queue实例，具有指定的名称
     */
    @Bean
    public Queue fanoutQueue2() {
        return new Queue("fanout.queue2");
    }

    /**
     * 将第二个队列绑定到Fanout交换机
     *
     * @param fanoutExchange Fanout类型的交换机
     * @param fanoutQueue2   要绑定的队列
     * @return Binding实例，表示第二个队列和交换机的绑定关系
     */
    @Bean
    public Binding bindingQueue2ToExchange(FanoutExchange fanoutExchange, Queue fanoutQueue2) {
        return BindingBuilder.bind(fanoutQueue2()).to(fanoutExchange);
    }

    @Bean
    public Queue objectMessageQueue() {
        return new Queue("object.queue");
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}
